package com.hk.common.utils;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Base64;
import java.util.Collection;
import java.util.Date;
import java.util.Map;


public class StringUtils {
    /**
     * 判断字符串是否为空
     *
     * @param str
     * @return
     */
    public static boolean isStringEmpty(String str) {
        return (null == str) || ("".equals(str.trim()));
    }

    /**
     * 判断集合是否为空
     *
     * @param <>
     * @param
     * @return
     */
    public static boolean isArrayEmpty(Object[] arr) {
        return (null == arr) || (1 > arr.length);
    }

    /**
     * 判断集合是否为空
     *
     * @param <E>
     * @param coll
     * @return
     */
    public static <E> boolean isCollectionEmpty(Collection<E> coll) {
        return (null == coll) || (coll.isEmpty());
    }

    /**
     * 判断map是否为空
     *
     * @param <K>
     * @param <V>
     * @param map
     * @return
     */
    public static <K, V> boolean isMapEmpty(Map<K, V> map) {
        return (null == map) || (map.size() == 0);
    }

    /**
     * 将文本转为数字, 如果转换异常, 返回0
     *
     * @param str
     * @return
     */
    public static int parseStr2Int(String str) {
        return parseStr2Int(str, 0);
    }

    /**
     * 将文本转为数字, 如果转换异常, 返回参数2
     *
     * @param str
     * @param init
     * @return
     */
    public static int parseStr2Int(String str, int init) {
        // 如果传入参数有误, 返回0
        if (isStringEmpty(str)) {
            return init;
        }

        try {
            return Integer.parseInt(str);
        } catch (NumberFormatException e) {
            return init;
        }
    }

    /**
     * 判断传入参数是否为ip地址
     *
     * @param ip
     * @return
     */
    public static boolean isIP(String ip) {
        // 如果传入ip为空, 直接返回false
        if (isStringEmpty(ip)) {
            return false;
        }
        return ip
                .matches("^(?:(?:[01]?\\d{1,2}|2[0-4]\\d|25[0-5])\\.){3}(?:[01]?\\d{1,2}|2[0-4]\\d|25[0-5])\\b");
    }

    /**
     * 判断传入参数是否为ip地址或ip集合(192.168.1.1,192.168.2.1,192.168.1.2-192.168.1.4)
     *
     * @param ips
     * @return
     */
    public static boolean isIPs(String ips) {
        // 如果传入ip为空, 直接返回false
        if (isStringEmpty(ips)) {
            return false;
        }
        return ips
                .matches("^(?:(?:[01]?\\d{1,2}|2[0-4]\\d|25[0-5])\\.){3}(?:[01]?\\d{1,2}|2[0-4]\\d|25[0-5])(,(?:(?:[01]?\\d{1,2}|2[0-4]\\d|25[0-5])\\.){3}(?:[01]?\\d{1,2}|2[0-4]\\d|25[0-5]))*\\b");
    }

    /**
     * 将一个日期转换成String 方法名：getDateString<BR>
     * 创建人：xuchengfei <BR>
     * 时间：2014年8月11日-下午9:59:14 <BR>
     *
     * @param date
     * @param pattern
     * @return String<BR>
     * @throws <BR>
     * @since 1.0.0
     */
    public static String formatDateToString(Date date, String pattern) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
        return simpleDateFormat.format(date);
    }

    /**
     * 将日期字符串转换成Date 方法名：getDateString<BR>
     * 创建人：xuchengfei <BR>
     * 时间：2014年8月11日-下午10:04:06 <BR>
     *
     * @param dateString
     * @param pattern
     * @return
     * @throws ParseException Date<BR>
     * @throws <BR>
     * @since 1.0.0
     */
    public static Date parseStringToDate(String dateString, String pattern)
            throws ParseException {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
        return simpleDateFormat.parse(dateString);
    }

    /**
     * 将小数格式化成字符串，会进行四舍五入 如：3656.4554===结果:3656.46<BR>
     * 方法名：formatDoubleToString<BR>
     * 创建人：xuchengfei <BR>
     * 时间：2014年8月12日-下午9:12:01 <BR>
     *
     * @param dou
     * @return String<BR>
     * @throws <BR>
     * @since 1.0.0
     */
    public static String formatDoubleToString(double dou, String format) {
        if (isEmpty(format)) {
            format = "#.##";
        }
        DecimalFormat decimalFormat = new DecimalFormat(format);
        // 四舍五入，逢五进一
        String string = decimalFormat.format(dou);
        return string;
    }

    /**
     * 判断字符串是否为空
     *
     * @param str
     * @return
     */
    public static boolean isEmpty(String str) {
        return null == str || str.length() == 0 || "".equals(str.trim());
    }

    /**
     * 非空判断 (这里用一句话描述这个方法的作用)<BR>
     * 方法名：isNotEmpty<BR>
     * 创建人：xuchengfei <BR>
     * 时间：2014年8月12日-下午9:36:18 <BR>
     *
     * @param str
     * @return boolean<BR>
     * @throws <BR>
     * @since 1.0.0
     */
    public static boolean isNotEmpty(String str) {
        return !isEmpty(str);
    }

    /**
     * 百分比转换 方法名：getPercent<BR>
     * 创建人：xuchengfei <BR>
     * 时间：2014年8月12日-下午9:50:46 <BR>
     *
     * @param num
     * @param totalCount
     * @param objects
     * @return String<BR>
     * @throws <BR>
     * @since 1.0.0
     */
    public static String getPercent(int num, double totalCount,
                                    String... objects) {
        String format = "#.##";
        if (objects != null && objects.length > 0) {
            format = objects[0];
        }
        return StringUtils.formatDoubleToString((num / totalCount) * 100,
                format) + "%";
    }

    /**
     * 百分比转换 方法名：getPercent<BR>
     * 创建人：xuchengfei <BR>
     * 时间：2014年8月12日-下午9:50:46 <BR>
     *
     * @param num        当前的数字
     * @param totalCount 总数
     * @param objects
     * @return String<BR>
     * @throws <BR>
     * @since 1.0.0
     */
    public static String getPercent(int num, float totalCount,
                                    String... objects) {// 动态参数
        String format = "#.##";
        if (objects != null && objects.length > 0) {
            format = objects[0];
        }
        return StringUtils.formatDoubleToString((num / totalCount) * 100,
                format) + "%";
    }

    /**
     * 冒泡排序方法,如果为true那就是降序，false那么久是升序 方法名：sorts<BR>
     * 创建人：xuchengfei <BR>
     * 时间：2014年8月12日-下午11:35:55 <BR>
     *
     * @param datas
     * @param flag
     * @return int[]<BR>
     * @throws <BR>
     * @since 1.0.0
     */
    public static int[] sorts(int[] datas, boolean flag) {
        // 轮询次数
        for (int i = 0; i < datas.length; i++) {
            // 交换次数
            for (int j = 0; j < datas.length - 1; j++) {
                if (flag) {
                    if (datas[j] < datas[j + 1]) {
                        int temp = datas[j];
                        datas[j] = datas[j + 1];
                        datas[j + 1] = temp;
                    }
                } else {
                    if (datas[j] > datas[j + 1]) {
                        int temp = datas[j];
                        datas[j] = datas[j + 1];
                        datas[j + 1] = temp;
                    }
                }
            }
        }
        return datas;
    }

    /**
     * 凯德加密 方法名：encryption<BR>
     * 创建人：xiaowei <BR>
     * 时间：2014年10月25日-下午9:48:19 <BR>
     *
     * @param str
     * @param k
     * @return String<BR>
     * @throws <BR>
     * @since 1.0.0
     */
    public static String encryption(String str, int k) {
        String string = "";
        for (int i = 0; i < str.length(); i++) {
            char c = str.charAt(i);
            if (c >= 'a' && c <= 'z') {
                c += k % 26;
                if (c < 'a') {
                    c += 26;
                }
                if (c > 'z') {
                    c -= 26;
                }
            } else if (c >= 'A' && c <= 'Z') {
                c += k % 26;
                if (c < 'A') {
                    c += 26;
                }
                if (c > 'Z') {
                    c -= 26;
                }
            }
            string += c;
        }
        return string;
    }

    /**
     * 凯德解密 方法名：dencryption<BR>
     * 创建人：xiaowei <BR>
     * 时间：2014年10月25日-下午9:48:35 <BR>
     *
     * @param str
     * @param n
     * @return String<BR>
     * @throws <BR>
     * @since 1.0.0
     */
    public static String dencryption(String str, int n) {
        String string = "";
        int k = Integer.parseInt("-" + n);
        for (int i = 0; i < str.length(); i++) {
            char c = str.charAt(i);
            if (c >= 'a' && c <= 'z') {
                c += k % 26;
                if (c < 'a') {
                    c += 26;
                }
                if (c > 'z') {
                    c -= 26;
                }
            } else if (c >= 'A' && c <= 'Z') {
                c += k % 26;
                if (c < 'A') {
                    c += 26;
                }
                if (c > 'Z') {
                    c -= 26;
                }
            }
            string += c;
        }
        return string;
    }

    /**
     * 文件后缀处理
     *
     * @param oldExt
     * @return
     */
    public static String ext(String oldExt) {
        String result = oldExt;
        if (oldExt != null && !oldExt.equals("")) {
            if (oldExt.toLowerCase().equals("xlsx")
                    || oldExt.toLowerCase().equals("xls")) {
                result = "xls";
            }
            if (oldExt.toLowerCase().equals("docx")
                    || oldExt.toLowerCase().equals("doc")) {
                result = "word";
            }
        }
        return result;
    }

    public static boolean isImage(String ext) {
        return ext.toLowerCase().matches("jpg|gif|bmp|png|jpeg");
    }

    public static boolean isDoc(String ext) {
        return ext
                .toLowerCase()
                .matches(
                        "doc|docx|xls|xlsx|pdf|txt|ppt|pptx|rar|zip|html|jsp|sql|htm|shtml|xml");
    }

    public static boolean isVideo(String ext) {
        return ext.toLowerCase().matches("mp4|flv|mp3|rmbv|avi");
    }

    public static String base64Encode(byte[] b) {
        if (b == null) {
            return null;
        }
        return new String(Base64.getEncoder().encode(b));
    }

    /**
     * md5加密 方法名：md5Base64<BR>
     * 时间：2014年11月28日-上午12:51:12 <BR>
     *
     * @param str
     * @return String<BR>
     * @throws <BR>
     * @since 1.0.0
     */
    public static String md5Base64(String str) {
        try {
            MessageDigest md5 = MessageDigest.getInstance("MD5");
            return base64Encode(md5.digest(str.getBytes()));
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return null;
    }

    public static String saltPassword(String slatString, String password) {
        return md5Base64(slatString + password);
    }


	/**
	 * 匿名化人名
	 * @param name
	 * @return
	 */
	public static String buildDisplayName(String name) {
        if (name == null || name.matches("^[a-zA-Z]*")) {
            return name;
        }
        if (name.length() <= 1) {
            return name;
        }
        if (name.length() == 2) {
            return name.substring(0, 1) + "*";
        }

        String firstName = name.substring(0, 1);
        String lastName = name.substring(name.length() - 1);
        return firstName + "*" + lastName;
    }

    /**
     * 截取ip字符串后n位 ip 10.81.35.201
     *
     * @param ip
     * @return
     */
    public static String buildDisplayIpNum(String ip, int n) {
        if (isIP(ip)) {
            int IP_MAX_COUNT = 4;
            for (int i = 0; i < (IP_MAX_COUNT - n); i++) {
                ip = ip.substring(ip.indexOf(".") + 1);
            }
        } else {
            ip = "";
        }
        return ip;
    }

}
